package Model;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class AdressBook {
	
	ArrayList<Person> Contacts;
	ArrayList<String> groupes;
	
	public AdressBook()
	{
		Contacts=new ArrayList<Person>();
		groupes=new ArrayList<String>();
	}
	
	//default
	public void createContact()
	{
		Contacts.add(new Person());
		
	}
	
	public void createContact(String nom, String prenom, String compagnieAdresse, String telephone, String siteWeb, String adresseMail, String groupe)
	{
		if(!this.checkListGroupes(groupe)) this.groupes.add(groupe);
		Contacts.add(new Person(nom,prenom,compagnieAdresse,telephone,siteWeb,adresseMail,groupe));
	}
	
	public void listContacts()
	{
		for (Person p : Contacts) {
			p.displayName();
		}
	}
	/**
	 * Recherche l'existence d'un groupe dans la liste des groupes
	 * @param groupe
	 * @return true si le groupe existe, faux sinon
	 */
	private boolean checkListGroupes(String groupe)
	{
		for(String s :groupes)
		{
			if(s.equalsIgnoreCase(groupe)) return true;
		}
		return false;
	}
	

	
	public ArrayList<Person> getContactList()
	{
		return this.Contacts;
	}
	
	public void loadContactListFromFile()
	{	
		InputStream is;
		Scanner inputStream;
		Person tempPerson;
		File fichier = new File("Resources/contactList.csv");
		
		try {
			inputStream = new Scanner(fichier);
		
		
		
		//Lit toutes les lignes du fichiers
		while (inputStream.hasNext()) {
			// read single line, put in string
			String personData = inputStream.nextLine();

			// Split de la ligne
			String dataTab[] = personData.split(",");
			
			DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss:SSS");
			Date date;
			try {
				date = formatter.parse(dataTab[7]);
				tempPerson=new Person(dataTab[0],dataTab[1],dataTab[2],dataTab[3],dataTab[4],dataTab[5],dataTab[6],date);
				if(!this.checkListGroupes(dataTab[6])) this.groupes.add(dataTab[6]);
				
				this.Contacts.add(tempPerson);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
			
			

		}
		// after loop, close scanner
		inputStream.close();
		
		
		
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	public void saveContactsInFile()
	{
		PrintWriter writer;
		try {
			writer = new PrintWriter("Resources/contactList.csv", "UTF-8");
		
			for(Person p :this.Contacts)
			{
				writer.println(p.getName()+","+p.getFirstName()+","+p.getCompanyAdress()+","+p.getPhoneNumber()+","+p.getHomePage()+","+p.getEmail()+","+p.getGroup()+","+p.getDateToString());
			
			}
		
		writer.close();
		
		
		} catch (FileNotFoundException | UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	/**
	 * Trouve une personne à partir de sa date et son heure d'ajout (clé Primaire)
	 * @param dateStr
	 * @return La personne recherchée, null en cas d'erreur
	 */
	public Person findPersonByData(String dateStr)
	{
		DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss:SSS");
		Date date;
		try {
			date = formatter.parse(dateStr);
		for(Person p : this.Contacts)
		{
			if(p.getDate().equals(date))
			{
				return p;
			}
		}
		}
		catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
		
	/**
	 * Modifie les infos d'une personne présente dans la liste de contacts
	 * @param CurrentlyModified
	 * @param dataset
	 */
	public void updateContact(ArrayList<String> CurrentlyModified, ArrayList<String> dataset)
	{
		
		Person p=findPersonByData(CurrentlyModified.get(7));
		p.setName(dataset.get(0));
		p.setFirstName(dataset.get(1));
		p.setGroup(dataset.get(2));
		p.setEmail(dataset.get(3));
		p.setPhoneNumber(dataset.get(4));
		p.setHomePage(dataset.get(5));
		p.setCompanyAdress(dataset.get(6));
		
	}
	
	/**
	 * Supprime un contact de l'arraylist
	 * @param dateStr
	 * @return
	 */
	public boolean deleteContact(String dateStr)
	{
		Person p=findPersonByData(dateStr);
		if(p==null)
		{
			return false;
		}
		else
		{
		this.Contacts.remove(p);
		return true;
		}
		
	}

}
